package com.mall4j.cloud.product.service.impl;

import com.mall4j.cloud.api.product.vo.*;
import com.mall4j.cloud.common.database.dto.PageDTO;
import com.mall4j.cloud.common.database.util.PageUtil;
import com.mall4j.cloud.common.database.vo.PageVO;
import com.mall4j.cloud.product.dto.*;
import com.mall4j.cloud.product.mapper.*;
import com.mall4j.cloud.product.model.Spu;
import com.mall4j.cloud.product.model.SpuDetail;
import com.mall4j.cloud.product.service.SpuService;
import com.mall4j.cloud.product.vo.SkuStockVO;
import com.mall4j.cloud.product.vo.SpuDetailVO;
import com.mall4j.cloud.product.vo.SpuExtensionVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * spu
 *
 * @author JCM
 * @date 2021-04-27 15:33:00
 */
@Service
public class SpuServiceImpl implements SpuService {

    @Autowired
    private SpuMapper spuMapper;

    @Autowired
    private SpuAttrValueMapper spuAttrValueMapper;

    @Autowired
    private SpuDetailMapper spuDetailMapper;

    @Autowired
    private SkuMapper skuMapper;

    @Autowired
    private SpuSkuAttrValueMapper spuSkuAttrValueMapper;

    @Autowired
    private BrandMapper brandMapper;

    @Autowired
    private SpuExtensionMapper spuExtensionMapper;

    @Override
    public PageVO<SpuVO> page(PageDTO pageDTO, SpuDTO spuDTO) {
        return PageUtil.doPage(pageDTO, () -> list(spuDTO));
    }


    @Override
    public List<SpuVO> list(SpuDTO spuDTO) {
        List<SpuVO> spuVOS = spuMapper.list(spuDTO);
        for (SpuVO spuVO : spuVOS) {
            setSpuVO(spuVO);
        }
        return spuVOS;
    }

    @Override
    public SpuVO getBySpuId(Long spuId) {
        SpuVO spuVO = spuMapper.getBySpuId(spuId);
        setSpuVO(spuVO);
        return spuVO;
    }

    @Override
    public void save(Spu spu) {
        spuMapper.save(spu);
    }

    @Override
    public void update(Spu spu) {
        spuMapper.update(spu);
    }

    @Transactional
    @Override
    public void deleteById(Long spuId) {
        spuDetailMapper.deleteBySpuId(spuId);
        spuSkuAttrValueMapper.deleteBySpuId(spuId);
        spuAttrValueMapper.deleteBySpuId(spuId);
        skuMapper.deleteBySpuId(spuId);
        spuExtensionMapper.deleteBySpuId(spuId);
        spuMapper.deleteById(spuId);
    }

    private void setSpuVO(SpuVO spuVO){
        //获取商品规格属性关联信息
        SpuAttrValueDTO spuAttrValueDTO = new SpuAttrValueDTO();
        spuAttrValueDTO.setSpuId(spuVO.getSpuId());
        List<SpuAttrValueVO> spuAttrValueVOS = spuAttrValueMapper.list(spuAttrValueDTO);
        spuVO.setSpuAttrValues(spuAttrValueVOS);

        //获取品牌信息
        Long brandId = spuVO.getBrandId();
        BrandVO brandVO = brandMapper.getByBrandId(brandId);
        spuVO.setBrand(brandVO);


        //获取商品详情
        SpuDetailVO spuDetailVO = spuDetailMapper.getBySpuId(spuVO.getSpuId());
        spuVO.setDetail(spuDetailVO.getDetail());

        //获取sku
        SkuDTO skuDTO = new SkuDTO();
        skuDTO.setSpuId(spuVO.getSpuId());
        List<SkuVO> skuVOS = skuMapper.list(skuDTO);


        for (SkuVO skuVO : skuVOS){
            SpuSkuAttrValueDTO spuSkuAttrValueDTO = new SpuSkuAttrValueDTO();
            spuSkuAttrValueDTO.setSpuId(spuVO.getSpuId());
            spuSkuAttrValueDTO.setSkuId(skuVO.getSkuId());
            List<SpuSkuAttrValueVO> spuSkuAttrValueVOS = spuSkuAttrValueMapper.list(spuSkuAttrValueDTO);
            skuVO.setSpuSkuAttrValues(spuSkuAttrValueVOS);

        }

        spuVO.setSkus(skuVOS);

        SpuExtensionVO spuExtensionVO = spuExtensionMapper.getBySpuId(spuVO.getSpuId());
        spuVO.setSaleNum(spuExtensionVO.getSaleNum());
        spuVO.setTotalStock(spuExtensionVO.getActualStock());

    }
}
